package com.atguigu.juc.date929;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author: shenhao
 * @CreatTime: 2024/9/29 18:18
 * @Version: 1.0
 * compare and swap的缩写，中文翻译成比较并交换,实现并发算法时常用到的一种技术。
 * CAS有3个操作数，位置内存值V，旧的预期值A，要修改的更新值B。
 * 当且仅当旧的预期值A和内存值V相同时，将内存值V修改为B，否则什么都不做或重来
 * 100个线程, 每个线程加1 100次, 最后的number值, 应为10000
 */
public class CASDemo {
    // V1 多线程环境不使用原子类AtomicInteger保证线程安全（基本数据类型）
    private Integer number = 0;

    public  Integer getNumber() {
        return number;
    }

    public synchronized void setNumber() {
        this.number++;
    }
    // v2 多线程环境    使用原子类AtomicInteger保证线程安全（基本数据类型）

    AtomicInteger atomicInteger = new AtomicInteger();// 默认为0

    public AtomicInteger getAtomicInteger() {
        return atomicInteger;
    }

    public void setAtomicInteger() {
        this.atomicInteger.incrementAndGet();
    }

    public static void main(String[] args) throws InterruptedException {
        //helloCAS();
        CASDemo casDemo = new CASDemo();
        // 需要使用一个倒计时
        CountDownLatch countDownLatch = new CountDownLatch(100);
        for (int i = 0; i < 100; i++) {
            Thread t1=new Thread(()->{
                for (int j = 0; j < 100; j++) {
                    casDemo.setNumber();
                    casDemo.setAtomicInteger();
                }
                countDownLatch.countDown();
            },"");
            t1.start();
        }

        countDownLatch.await();
        System.out.println(Thread.currentThread().getName()+"::"+casDemo.getNumber());
        System.out.println(Thread.currentThread().getName()+"::"+casDemo.getAtomicInteger());
    }

    private static void helloCAS() {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println(atomicInteger.compareAndSet(5, 2020)+":"+atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(5, 2024)+":"+atomicInteger.get());
    }
}
